`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2023/11/08 15:56:04
// Design Name: 
// Module Name: uart_tx
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module uart_tx#(
    parameter   UART_DATAWIDTH  =   8,
    parameter   UART_CHECK      =   0,
    parameter   UART_STOP_WIDTH =   1
)(
    input                               i_clk           ,
    input                               i_rst           ,
    input  [UART_DATAWIDTH - 1 : 0]     i_user_tx_data  ,
    input                               i_user_tx_valid ,

    output                              o_uart_tx       ,
    output                              o_user_tx_ready 
    );

/*********parameter**********/

/*********wire***************/
wire                            w_tx_active         ;
/*********reg****************/
reg [15 : 0]                    r_cnt               ;
reg [UART_DATAWIDTH - 1 : 0]    r_o_user_tx_data    ;
reg                             r_tx_check          ;
reg                             r_o_user_tx_ready   ;

/*********code***************/
assign  w_tx_active = r_o_user_tx_ready & i_user_tx_valid;
always @(posedge i_clk,posedge i_rst ) begin
    if(i_rst)
        r_cnt <= 'd0;
    else if(r_cnt == 2 + UART_DATAWIDTH + UART_STOP_WIDTH -1 && UART_CHECK != 0)
        r_cnt <= 'd0;
    else if(r_cnt == 2 + UART_DATAWIDTH + UART_STOP_WIDTH -2 && UART_CHECK == 0)
        r_cnt <= 'd0;
    else if(w_tx_active )
        r_cnt <= r_cnt + 'd1;
end
endmodule
